home *** CD-ROM | disk | FTP | other *** search
/ Dr. Windows 3 / dr win3.zip / dr win3 / PROGRAMR / OLE2BOOK.ZIP / CHAP06.ZIP / CHAP06 / DATAUSER / DATAUSER.CPP next >
C/C++ Source or Header  |  1993-06-15  |  18KB  |  658 lines

  1. /*
  2.  * DATAUSER.CPP
  3.  *
  4.  * A user of the Data Objects for Chapter 6
  5.  *
  6.  * Copyright (c)1993 Microsoft Corporation, All Rights Reserved
  7.  *
  8.  * Kraig Brockschmidt, Software Design Engineer
  9.  * Microsoft Systems Developer Relations
  10.  *
  11.  * Internet  :  kraigb@microsoft.com
  12.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  13.  */
  14.  
  15.  
  16. #define INITGUIDS
  17. #include "datauser.h"
  18.  
  19.  
  20. //These are for displaying clipboard formats textually.
  21. static char * rgszCF[13]={"Unknown", "CF_TEXT", "CF_BITMAP", "CF_METAFILEPICT"
  22.                  , "CF_SYLK", "CF_DIF", "CF_TIFF", "CF_OEMTEXT", "CF_DIB"
  23.                  , "CF_PALETTE", "CF_PENDATA", "CF_RIFF", "CF_WAVE"};
  24.  
  25.  
  26. static char szSuccess[]    ="succeeded";
  27. static char szFailed[]     ="failed";
  28. static char szExpected[]   ="expected";
  29. static char szUnexpected[] ="unexpected!";
  30.  
  31.  
  32. /*
  33.  * WinMain
  34.  *
  35.  * Purpose:
  36.  *  Main entry point of application.
  37.  */
  38.  
  39. int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hInstPrev
  40.     , LPSTR pszCmdLine, int nCmdShow)
  41.     {
  42.     MSG         msg;
  43.     LPAPPVARS   pAV;
  44.  
  45.    #ifndef WIN32
  46.     SetMessageQueue(96);
  47.    #endif
  48.  
  49.     //Create and initialize the application.
  50.     pAV=new CAppVars(hInst, hInstPrev, nCmdShow);
  51.  
  52.     if (NULL==pAV)
  53.         return -1;
  54.  
  55.     if (pAV->FInit())
  56.         {
  57.         while (GetMessage(&msg, NULL, 0,0 ))
  58.             {
  59.             TranslateMessage(&msg);
  60.             DispatchMessage(&msg);
  61.             }
  62.         }
  63.  
  64.     delete pAV;
  65.     return msg.wParam;
  66.     }
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74. /*
  75.  * DataUserWndProc
  76.  *
  77.  * Purpose:
  78.  *  Window class procedure.  Standard callback.
  79.  */
  80.  
  81. LRESULT FAR PASCAL __export DataUserWndProc(HWND hWnd, UINT iMsg
  82.     , WPARAM wParam, LPARAM lParam)
  83.     {
  84.     HRESULT         hr;
  85.     LPAPPVARS       pAV;
  86.     HMENU           hMenu;
  87.     FORMATETC       fe;
  88.     WORD            wID;
  89.  
  90.     //This will be valid for all messages except WM_NCCREATE
  91.     pAV=(LPAPPVARS)GetWindowLong(hWnd, DATAUSERWL_STRUCTURE);
  92.  
  93.     switch (iMsg)
  94.         {
  95.         case WM_NCCREATE:
  96.             //CreateWindow passed pAV to us.
  97.             pAV=(LPAPPVARS)((LONG)((LPCREATESTRUCT)lParam)->lpCreateParams);
  98.  
  99.             SetWindowLong(hWnd, DATAUSERWL_STRUCTURE, (LONG)pAV);
  100.             return (DefWindowProc(hWnd, iMsg, wParam, lParam));
  101.  
  102.         case WM_DESTROY:
  103.             PostQuitMessage(0);
  104.             break;
  105.  
  106.         case WM_PAINT:
  107.             pAV->Paint();
  108.             break;
  109.  
  110.         case WM_COMMAND:
  111.             SETDefFormatEtc(fe, 0, TYMED_HGLOBAL | TYMED_GDI | TYMED_MFPICT);
  112.  
  113.             hMenu=GetMenu(hWnd);
  114.             wID=LOWORD(wParam);
  115.  
  116.             switch (wID)
  117.                 {
  118.                 case IDM_OBJECTUSEDLL:
  119.                     if (!pAV->m_fEXE)
  120.                         break;
  121.  
  122.                     pAV->m_fEXE=FALSE;
  123.                     pAV->FReloadDataObjects(TRUE);
  124.                     break;
  125.  
  126.  
  127.                 case IDM_OBJECTUSEEXE:
  128.                     if (pAV->m_fEXE)
  129.                         break;
  130.  
  131.                     pAV->m_fEXE=TRUE;
  132.                     pAV->FReloadDataObjects(TRUE);
  133.                     break;
  134.  
  135.                 case IDM_OBJECTDATASIZESMALL:
  136.                 case IDM_OBJECTDATASIZEMEDIUM:
  137.                 case IDM_OBJECTDATASIZELARGE:
  138.                     CheckMenuItem(hMenu, IDM_OBJECTDATASIZESMALL,  MF_UNCHECKED);
  139.                     CheckMenuItem(hMenu, IDM_OBJECTDATASIZEMEDIUM, MF_UNCHECKED);
  140.                     CheckMenuItem(hMenu, IDM_OBJECTDATASIZELARGE,  MF_UNCHECKED);
  141.                     CheckMenuItem(hMenu, wID,  MF_CHECKED);
  142.  
  143.                     //Kill old advise.
  144.                     if (NULL!=pAV->m_pIDataObject || 0!=pAV->m_dwConn)
  145.                         pAV->m_pIDataObject->DUnadvise(pAV->m_dwConn);
  146.  
  147.                     if (IDM_OBJECTDATASIZELARGE==wID)
  148.                         pAV->m_pIDataObject=pAV->m_pIDataLarge;
  149.                     else if (IDM_OBJECTDATASIZEMEDIUM==wID)
  150.                         pAV->m_pIDataObject=pAV->m_pIDataMedium;
  151.                     else
  152.                         pAV->m_pIDataObject=pAV->m_pIDataSmall;
  153.  
  154.                     //Setup new advise.
  155.                     fe.cfFormat=pAV->m_cfAdvise;
  156.                     pAV->m_pIDataObject->DAdvise(&fe, ADVF_NODATA
  157.                         , pAV->m_pIAdviseSink, &pAV->m_dwConn);
  158.  
  159.                     break;
  160.  
  161.                 case IDM_OBJECTQUERYGETDATA:
  162.                     if (NULL==pAV->m_pIDataObject)
  163.                         break;
  164.  
  165.                     fe.tymed=TYMED_HGLOBAL | TYMED_GDI | TYMED_MFPICT;
  166.  
  167.                     pAV->TryQueryGetData(&fe, CF_TEXT,         TRUE,  0);
  168.                     pAV->TryQueryGetData(&fe, CF_BITMAP,       TRUE,  1);
  169.                     pAV->TryQueryGetData(&fe, CF_DIB,          FALSE, 2);
  170.                     pAV->TryQueryGetData(&fe, CF_METAFILEPICT, TRUE,  3);
  171.                     pAV->TryQueryGetData(&fe, CF_WAVE,         FALSE, 4);
  172.                     break;
  173.  
  174.  
  175.                 case IDM_OBJECTGETDATATEXT:
  176.                 case IDM_OBJECTGETDATABITMAP:
  177.                 case IDM_OBJECTGETDATAMETAFILEPICT:
  178.                     if (NULL==pAV->m_pIDataObject)
  179.                         break;
  180.  
  181.                     //Clean up whatever we currently have.
  182.                     pAV->m_cf=0;
  183.                     ReleaseStgMedium(&pAV->m_stm);
  184.  
  185.                     if (IDM_OBJECTGETDATATEXT==wID)
  186.                         SETDefFormatEtc(fe, CF_TEXT, TYMED_HGLOBAL);
  187.  
  188.                     if (IDM_OBJECTGETDATABITMAP==wID)
  189.                         SETDefFormatEtc(fe, CF_BITMAP, TYMED_GDI);
  190.  
  191.                     if (IDM_OBJECTGETDATAMETAFILEPICT==wID)
  192.                         SETDefFormatEtc(fe, CF_METAFILEPICT, TYMED_MFPICT);
  193.  
  194.                     pAV->m_stm.tymed=fe.tymed;
  195.                     hr=pAV->m_pIDataObject->GetData(&fe, &(pAV->m_stm));
  196.  
  197.                     if (SUCCEEDED(hr))
  198.                         pAV->m_cf=fe.cfFormat;
  199.  
  200.                     InvalidateRect(hWnd, NULL, TRUE);
  201.                     UpdateWindow(hWnd);
  202.                     break;
  203.  
  204.                 case IDM_OBJECTEXIT:
  205.                     PostMessage(hWnd, WM_CLOSE, 0, 0L);
  206.                     break;
  207.  
  208.  
  209.                 case IDM_ADVISETEXT:
  210.                 case IDM_ADVISEBITMAP:
  211.                 case IDM_ADVISEMETAFILEPICT:
  212.                     if (NULL==pAV->m_pIDataObject)
  213.                         break;
  214.  
  215.                     //Terminate the old connection
  216.                     if (0!=pAV->m_dwConn)
  217.                         pAV->m_pIDataObject->DUnadvise(pAV->m_dwConn);
  218.  
  219.                     CheckMenuItem(hMenu, pAV->m_cfAdvise+IDM_ADVISEMIN, MF_UNCHECKED);
  220.                     CheckMenuItem(hMenu, wID, MF_CHECKED);
  221.  
  222.                     //New format is wID-IDM_ADVISEMIN
  223.                     pAV->m_cfAdvise=(UINT)(wID-IDM_ADVISEMIN);
  224.                     fe.cfFormat=pAV->m_cfAdvise;
  225.                     pAV->m_pIDataObject->DAdvise(&fe, ADVF_NODATA
  226.                         , pAV->m_pIAdviseSink, &pAV->m_dwConn);
  227.  
  228.                     break;
  229.  
  230.                 case IDM_ADVISEGETDATA:
  231.                     pAV->m_fGetData=!pAV->m_fGetData;
  232.                     CheckMenuItem(hMenu, wID, pAV->m_fGetData ? MF_CHECKED : MF_UNCHECKED);
  233.                     break;
  234.  
  235.                 case IDM_ADVISEREPAINT:
  236.                     pAV->m_fRepaint=!pAV->m_fRepaint;
  237.                     CheckMenuItem(hMenu, wID, pAV->m_fRepaint ? MF_CHECKED : MF_UNCHECKED);
  238.                     break;
  239.  
  240.                 default:
  241.                     break;
  242.                 }
  243.             break;
  244.  
  245.         default:
  246.             return (DefWindowProc(hWnd, iMsg, wParam, lParam));
  247.         }
  248.  
  249.     return 0L;
  250.     }
  251.  
  252.  
  253.  
  254.  
  255.  
  256. /*
  257.  * CAppVars::CAppVars
  258.  * CAppVars::~CAppVars
  259.  *
  260.  * Constructor Parameters: (from WinMain)
  261.  *  hInst           HINSTANCE of the application.
  262.  *  hInstPrev       HINSTANCE of a previous instance.
  263.  *  nCmdShow        UINT specifying how to show the app window.
  264.  *
  265.  */
  266.  
  267. CAppVars::CAppVars(HINSTANCE hInst, HINSTANCE hInstPrev, UINT nCmdShow)
  268.     {
  269.     m_hInst       =hInst;
  270.     m_hInstPrev   =hInstPrev;
  271.     m_nCmdShow    =